package com.lanyou.esb.redis.proxy.impl;

import org.springframework.stereotype.Service;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.lanyou.esb.common.Constants4Redis;
import com.lanyou.esb.redis.JedisPoolUtils;
import com.lanyou.esb.redis.proxy.base.BaseListJedisProxy;
import com.lanyou.esb.redis.vo.AccLogVo;

/**
 * 服务日志Redis操作代理 <br>
 * 描述：分两个列表存储日志，一个保留固定时间的日志数据；一个保留待存储的日志数据；
 * 当新的日志产生时，先将其存储到待持久化区内(存储时间比较短)，然后再把它存储到固定时间列表上(存储时间比较长)。<br>
 * 后继对数据的操作：一个线程擦除过期数据，另一个线程将数据存储到数据库中；
 * 
 * @author Davey.wu
 */
@Service
public class AccLogJedisProxy extends BaseListJedisProxy<AccLogVo> {

	public AccLogJedisProxy() {
		this.setListKey(Constants4Redis.REDIS_LIST_KEY_ACCLOG_P);
	}

	@Override
	public void rpush(String key, AccLogVo log) throws JsonProcessingException {
		if (log == null) {
			return;
		}
		Jedis jedis = JedisPoolUtils.getJedis();
		if (jedis == null) {
			return;
		}
		boolean broken = false;
		try {
			Pipeline p = jedis.pipelined();
			String value = this.toJson(log);
			// 将日志信息存储到待持久化区内
			p.rpush(this.getListKey(), value);
			// 将日志信息存储到固定时间列表上
			// p.rpush(LIST_KEY_T, value);
			p.sync();
		} catch (Exception e) {
			broken = true;
		} finally {
			JedisPoolUtils.returnRes(jedis, broken);
		}
	}

}
